package cn.duli.xianer.service;

import cn.duli.xianer.pojo.Goods;
import com.github.pagehelper.Page;

import java.util.Date;
import java.util.List;
import java.util.Set;

public interface GoodsService {

    /**
     * 新增商品
     * @param goods
     */
    int save(Goods goods);

    /**
     * 修改商品
     * @param goods
     */
    void update(Goods goods);

    /**
     * 根据id查找此商品基本信息
     * @param gId
     * @return
     */
    Goods findById(Integer gId);

    /**
     * 根据id删除此商品
     * @param gId
     */
    void deleteById(Integer gId);

    /**
     * 根据id取消删除的商品(回收站回收某个商品)
     * @param gId
     */
    void cancelDeleteById(Integer gId);

    /**
     * 根据id下架此商品
     * @param gId
     */
    void shelveById(Integer gId);

    /**
     * 根据id取消被下架的商品（上架）
     * @param gId
     */
    void cancelShelveById(Integer gId);

    /**
     * 根据用户id查询该用户下架的商品列表
     * @param gUid
     * @return
     */
    Page<Goods> findShelveByUserId(Integer gUid);


    // 根据用户id查询该用户审核中的商品列表
    Page<Goods> findVerifyIngByUid(Integer gUid);

    // 根据用户id查询该用户审核失败的商品列表
    Page<Goods> findDieVerifyByUid(Integer gUid);

    /**
     * 分页查询所有审核中的商品列表
     * @return
     */
    Page<Goods> findAllVerifyIng();


    /**
     * 分页查询所有审核失败的商品列表
     * @return
     */
    Page<Goods> findDieVerify();

    /**
     * 分页查询所有正常售卖的商品列表
     * @return
     */
    Page<Goods> findSellIng();

    /**
     * 分页查询所有下架了的商品列表
     * @return
     */
    Page<Goods> findShelved();


    /**
     * 根据商品id修改此商品的审核状态
     */
    void updateMode(Goods goods);

    /**
     * 根据用户id查询此用户发布的商品列表
     * @param gUid
     * @return
     */
    Page<Goods> findByUserId(Integer gUid);


    /**
     * 分页查询所有商品
     * @return
     */
    Page<Goods> findAll();


    /**
     * 分页根据商品名称模糊查询商品列表
     * @param gName
     * @return
     */
    Page<Goods> queryLikeByGoodName(String gName);

    /**
     * 分页根据类别名模糊查询商品列表
     * @param tName
     * @return
     */
    Page<Goods> queryLikeByTypeName(String tName);

    /**
     * 分页根据发布地点查询商品列表
     * @param gAddr
     * @return
     */
    Page<Goods> queryLikeByAddr(String gAddr);

    /**
     * 分页根据时间区间动态查询发布的商品列表
     * @param startTime
     * @param endTime
     * @return
     */
    Page<Goods> queryByTimeInterval(String startTime, String endTime);

    /**
     * 分页根据二级类别id查询该类别下的商品列表
     * @param tId
     * @return
     */
    Page<Goods> queryByTypeTwoLevelId(Integer tId);

    // 根据商品id修改此商品浏览量
    void updateViewNum(Goods goods);

    // 根据时间区间、价格区间、商品成色、类别动态分页查询商品列表
    Page<Goods> queryDynamic(String startTime, String endTime,
                             String lowPrice, String topPrice,
                             String gLevel, String gTid);

    // 查询商品表里面的所有成色
    List<Goods> findGlevel();

    // 查询浏览量最多的前8条数据
    List<Goods> topByViewNum();

    // 查询最新上架的前4条数据
    List<Goods> topNewTime();

    // 根据用户id查询此用户发布的所有商品列表
    List<Goods> findAllByUserId(Integer gUid);

    // 查找商品总数
    int findGoodsCount();


    // 推荐算法中，先查询set中的元素，再查询(3-end的长度)个元素 - 前提：元素不能存在于end中；不能是用户当前购买的商品
    List<Goods> findRecommend(Set<Integer> set, Integer gId, Integer count);

    // 根据商品id批量查找商品列表
    List<Goods> findByIds(Set<Integer> ids);

    // 根据时间区间动态查询发布的商品列表
    List<Goods> queryByTimeIntervalTwo(String startTime, String endTime);
}
